## Refactoring

[![Рефакторинг: причины, цели, техники и процесс](https://img.youtube.com/vi/z73wmpdweQ4/0.jpg)](https://www.youtube.com/watch?v=z73wmpdweQ4)

* Рефакторинг - исправление кода без изменения его внешнего поведения

Когда проводим рефакторинг:
- Когда код написан и он без ошибок
- Когда написаны тесты и они проходят
- Когда нужно сохранить знания о предметной области
- Когда программных компонент часто требует изменений

Когда не проводим:
- Без тестов или со сломанными тестами
- Когад нужно разработать новую функциональность
- Когда нужно изменить поведение уже имеющейся функциональности
- Когда лучше переписать с нуля

Цели:
- Улучшение характеристик кода
  - понимаемость человеком
  - удовлетворение новых конвенций
  - изменяемость (скорость внесения изменений)
  - гибкость (возможность интегрировать или перекомпоновать внутри)
  - использование новых возможностей языка
- Улучшение характеристик исполнения
  - скорость работы алгоритмов
  - потребление памяти
  - уход от блокирующих операций

Важные аспекты:
- Определяем границы программного компонента для рефакторинга
- Сначала изучаем код и находим все типовые места, которые хотим менять
- Меняем небольшими шагами
- Не откладываем на потом

Техники:
- Переименование
- Избавление от дублирующих фрагментов
- Разделение функций и методов на несколько
- Объединение функций и методов
- Выделение переменных из выражений
- Удаление переменных и объединение выражений
- Разделение классов на несколько
- Объединение классов в один
- Замена внутренних структур данных
- Замена внутренних алгоритмов
- Бросить исключение вместо возврата ошибки
- Вернуть ошибку вместо исключения
- Перемещение кода в иерархии наследования вверх и вниз
- Замена наследования делегированием
- Замена делегирования наследованием
